/**
//给你一个二叉树的根节点 root ，判断其是否是一个有效的二叉搜索树。 
//
// 有效 二叉搜索树定义如下： 
//
// 
// 节点的左子树只包含 小于 当前节点的数。 
// 节点的右子树只包含 大于 当前节点的数。 
// 所有左子树和右子树自身必须也是二叉搜索树。 
// 
//
// 
//
// 示例 1： 
//
// 
//输入：root = [2,1,3]
//输出：true
// 
//
// 示例 2： 
//
// 
//输入：root = [5,1,4,null,null,3,6]
//输出：false
//解释：根节点的值是 5 ，但是右子节点的值是 4 。
// 
//
// 
//
// 提示： 
//
// 
// 树中节点数目范围在[1, 10⁴] 内 
// -2³¹ <= Node.val <= 2³¹ - 1 
// 
// Related Topics 树 深度优先搜索 二叉搜索树 二叉树 👍 1307 👎 0

*/

package com.xixi.dataStructure.tree.binaryTree;

import com.xixi.dataStructure.tree.TreeNode;

public class ID00098ValidateBinarySearchTree {
public static void main(String[] args) {
Solution solution = new ID00098ValidateBinarySearchTree().new Solution();
}


//leetcode submit region begin(Prohibit modification and deletion)
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    boolean result = true;

    public boolean isValidBST(TreeNode root) {
        result = deepSearch(root, Long.MIN_VALUE, Long.MAX_VALUE); //最开始无上下限
        return result;

    }
    /*
     * @Desc:
     * @Author vincentML
     * @Date: 2021/11/22 14:13
     * @param node 当前节点
     * @param lower 往右子树遍历，代入下限
     * @param upper 往左子树遍历，代入上限
 * @return boolean
    */
    public boolean deepSearch(TreeNode node, long lower, long upper){
        if(node == null) return  result;
        if(node.val <= lower || node.val >= upper){ //不在上下限的区间内，就不满足搜索树条件
            return false;
        }

        //遍历左子树，右边上限变小，代入根节点左边的下限
        //遍历右子树，左边下限变大，代入根节点右边的上限
        return deepSearch(node.left, lower, node.val) && deepSearch(node.right, node.val, upper);

    }

}
//leetcode submit region end(Prohibit modification and deletion)




}